package com.shm.leetcode;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

/**
 * @author: shm
 * @dateTime: 2020/10/16 8:12
 * @description: 面试题 01.08. 零矩阵
 * 编写一种算法，若M × N矩阵中某个元素为0，则将其所在的行与列清零。
 *
 * 示例 1：
 *
 * 输入：
 * [
 *   [1,1,1],
 *   [1,0,1],
 *   [1,1,1]
 * ]
 * 输出：
 * [
 *   [1,0,1],
 *   [0,0,0],
 *   [1,0,1]
 * ]
 * 示例 2：
 *
 * 输入：
 * [
 *   [0,1,2,0],
 *   [3,4,5,2],
 *   [1,3,1,5]
 * ]
 * 输出：
 * [
 *   [0,0,0,0],
 *   [0,4,5,0],
 *   [0,3,1,0]
 * ]
 */
public class SetZeroes {
    public void setZeroes(int[][] matrix) {
        Set<Integer> rowSet = new HashSet<>();
        Set<Integer> colSet = new HashSet<>();
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[0].length; j++) {
                if (matrix[i][j]==0){
                    rowSet.add(i);
                    colSet.add(j);
                }
            }
        }

        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[0].length; j++) {
                if (rowSet.contains(i)||colSet.contains(j)){
                    matrix[i][j]=0;
                }
            }
        }
    }

    public void setZeroes_1(int[][] matrix) {
        int m = matrix.length, n = matrix[0].length;
        boolean[] row = new boolean[m];
        boolean[] col = new boolean[n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == 0) {
                    row[i] = col[j] = true;
                }
            }
        }
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (row[i] || col[j]) {
                    matrix[i][j] = 0;
                }
            }
        }
    }

    /**
     * @author: shm
     * @dateTime: 2020/10/16 8:42
     * @description: 先记录第一行第一列是否有0，然后利用第一行第一列作为标记，先清除非第一行或非第一列的数据，最后根据第一列第一列是否有0来清除第一行第一列。
     */
    public void setZeroes_2(int[][] matrix){
        boolean firstRow = false,firstCol=false;
        for (int i = 0; i < matrix[1].length; i++) {
            if (matrix[0][i]==0){
                firstRow = true;
                break;
            }
        }

//        for (int i = 0; i < matrix.length; i++) {
//            if (matrix[i][0]==0){
//                firstCol =true;
//                break;
//            }
//        }
        for (int[] ints : matrix) {
            if (ints[0] == 0) {
                firstCol = true;
                break;
            }
        }

        for (int i = 1; i < matrix.length; i++) {
            for (int j = 1; j < matrix[0].length; j++) {
                if (matrix[i][j]==0){
                    matrix[i][0]=0;
                    matrix[0][j]=0;
                }
            }
        }
        for (int i = 1; i < matrix.length; i++) {
            for (int j = 1; j < matrix[0].length; j++) {
                if (matrix[i][0]==0||matrix[0][j]==0){
                    matrix[i][j]=0;
                }
            }
        }

        if (firstRow) {
//            for (int i = 0; i < matrix[0].length; i++) {
//                matrix[0][i]=0;
//            }
            Arrays.fill(matrix[0], 0);
        }
        if (firstCol){
            for (int i = 0; i < matrix.length; i++) {
                matrix[i][0]=0;
            }
        }
    }
}
